//
//  LWComposeTextView+Extension.swift
//  LW_Weibo
//
//  Created by 刘伟 on 16/7/21.
//  Copyright © 2016年 LWSpro. All rights reserved.
//

import UIKit


//因为我们自定义的LWComposeTextView已经封装很好了,为了不改动LWComposeTextView  我们将表情键盘的逻辑写在自定义的LWComposeTextView 的 分类中
extension LWComposeTextView {
    
    
    // 根据textView里面富文本获取对应的字符串  因为发送网络请求的时候,服务器要根据输入的图片所对应的chs  来组成字符串 然后返回我们需要的图片
    
    var emoticonString: String {
  
    
        //可变字符串,用于拼接我们输入的富文本以及文本文字的
        var groundStr = ""
    
        //  根据指定的范围,遍历我们的富文本
        //  infoDic - 表示遍历到内容
        //  range  - 表示遍历到范围
        //  stop   - 是否停止      a.memory = true

        self.attributedText.enumerateAttributesInRange(NSMakeRange(0, self.attributedText.length), options: []) { (infoDic, range, _) -> Void in
            
            if let attachment = infoDic["NSAttachment"] as? LWTextAttachment {
                
                
                //有图片
                let chs = attachment.emoticon!.chs!
                
                //拼接表情描述
                groundStr += chs
                
              //不是图片就会进入这个方法
            }else { //不是图片  那么就是输入的文字 或者emoji表情
                
                //获取指定范围内的文字  整个富文本的长度里面取文字
                let text = self.attributedText.attributedSubstringFromRange(range).string
                
                //拼接
                groundStr += text
                
                
            }
            
            
        }
    
        
        return groundStr
    
    }
    
    
    
    
    
    
    
    //根据传进来的表情按钮的模型  我们为LWComposeTextView添加富文本
     func insertEmoticon(emoticon: LWEmoticon) {
        
        //图片
        if emoticon.type == "0" {
            
//            //记录上一次的富文本  每点击一个表情按钮就给富文本,多次点击,必须拼接,不然会被替换 用一个可变的NSMutableAttributedString进行拼接,然后给富文本赋值  我们在这里每次只需记录上一次的富文本即可  再次点击表情按钮传进来的表情  就会拼接在上一次的富文本后面
            let originalAttributedStr = NSMutableAttributedString(attributedString: self.attributedText)
            
            //获取表情按钮的对应表情图片
            let image = UIImage(named: emoticon.path!)
            //通过UIImage创建一个文本附件(NSTextAttachment)
            let attachment = LWTextAttachment()
            
            //设置图片  之所以要赋值图片  是因为我们给用户看的时候是图片,但发送给服务器的确实图片所对应的chs
            attachment.image = image
            
            //将表情模型给文本附件,到时发送微博后,我们在首页要显示的时候,会需要表情模型
            attachment.emoticon = emoticon
            
            //获取行高 指定大小 根据我们发布的文字大小 来设置图片的大小
            let fontHeight = self.font!.lineHeight
            
            //设置图片的大小 y填-4 试出来的
            attachment.bounds = CGRect(x: 0, y: -4, width: fontHeight, height: fontHeight)
            
            //通过自定义的LWTextAttachment创建富文本
            let attributedStr = NSAttributedString(attachment: attachment)
            
            //获取我们选中的内容的范围
            var range = self.selectedRange
            
            //根据指定范围替换想要的富文本  就是将我们选中的文字替换成表情图片
            //如果没有文字，那么选中的范围就是0  我们这是替换 其实就是添加一个表情而已
            originalAttributedStr.replaceCharactersInRange(range, withAttributedString: attributedStr)
            
            
            //指定富文本字体大小
            originalAttributedStr.addAttribute(NSFontAttributeName, value: self.font!, range: NSMakeRange(0, originalAttributedStr.length))
            
            
            //给富文本赋值
            self.attributedText = originalAttributedStr
            
            //每次点击  光标位置需要加1 而再次选中的长度设为0  这样光标就会停留在我们用表情替换掉的那些选中的文字的后面,也就是停留在表情的后面,不加1那么光标则停留在表情的前面 长度不为0的话,光标就会从开始的位置,在选中一个长度
            range.location += 1; range.length = 0
            
            //  根据选中的范围设置光标的位置
            self.selectedRange = range

            //自己发送文字通知  一般这个通知是系统自己发的  我们只需要接收就行 但是在这里 我们输入富文本 系统是不会自己帮我们发送通知的，需要我们自己发送通知
            NSNotificationCenter.defaultCenter().postNotificationName(UITextViewTextDidChangeNotification, object: nil)
            
            
            //同样的道理  我们输入富文本,系统是不会通过代理对象去执行文字改变的函数(也即是代理方法)  需要我们手动执行
            
            //  ? 判断前面的代理方法是否实现,如果没有实现则不执行后面的代码,否则执行后面代码
            //  目前情况下,我们的代理对象已经实现了代理方法,我们可以对其强制解包, 考虑代码严谨我们建议大家还是 '?'
            self.delegate?.textViewDidChange?(self)

            
            
        }else {  //emoji 表情  也即是字符串
            
            //转换编码
            let emoji = (emoticon.code! as NSString).emoji()
            
            //插入文本
            self.insertText(emoji)
            
            
        }
        
        
        
    }
    
    
    
    
}


